package com.hyt.it.ogt.kq.service.gov.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hyt.it.ogt.kq.service.gov.api.ks.model.CandidateAreaVO;
import com.hyt.it.ogt.kq.service.gov.arrange.model.Room;
import com.hyt.it.ogt.kq.service.gov.feign.ks.model.PushTimeRoomCandidateVO;
import com.hyt.it.ogt.kq.service.gov.model.dto.arrange.IdCardAdmissionNumberDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.arrange.TimeRoomCandidateDTO;
import com.hyt.it.ogt.kq.service.gov.model.entity.TaskRoom;
import com.hyt.it.ogt.kq.service.gov.model.entity.Time;
import com.hyt.it.ogt.kq.service.gov.model.entity.TimeRoomCandidate;
import com.hyt.it.ogt.kq.service.gov.model.param.ArrangedEditParam;
import com.hyt.it.ogt.kq.service.gov.model.param.arrange.ArrangeResultByRoomParam;
import com.hyt.it.ogt.kq.service.gov.model.pdf.AdmissionTicketBean;
import com.hyt.it.ogt.kq.service.gov.model.vo.*;
import com.hyt.it.ogt.kq.service.gov.model.vo.arrange.ArrangeCount;
import com.hyt.it.ogt.kq.service.gov.model.vo.arrange.ArrangeResultByRoomVO;
import com.hyt.it.ogt.kq.service.model.vo.wechat.PushExamNotifyDTO;
import com.hyt.it.ogt.kq.service.model.vo.wechat.WeChatCandidateArrangeDetailVO;
import com.hyt.it.ogt.kq.service.model.vo.wechat.WeChatCandidateArrangeVO;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.gce.GceCandidate;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.gce.GceSeat;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.obt.ObtCandidate;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.obt.Seat;
import com.hyt.model.PageParam;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.cursor.Cursor;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 考生编排信息表 Mapper 接口
 * </p>
 *
 * @author huangyh
 * @since 2021-04-08
 */
public interface TimeRoomCandidateMapper extends BaseMapper<TimeRoomCandidate> {

    /**
     * 编排考生的的座位号
     * 
     * @param timeRoomVO
     * @return
     */
    List<String> selectArrangeCandidateSeatNum(TimeRoomVO timeRoomVO);

    /**
     * 查询准考证号最大的自增序号--按组
     * 
     * @param taskId
     * @param figures
     * @param province
     * @param city
     * @param district
     * @return
     */
    Integer selectMaxSeaNumByGroup(String taskId, Integer figures, String province, String city, String district);

    /**
     * 查询准考证号最大的自增序号--手动设置
     * 
     * @param taskId
     * @param figures
     * @return
     */
    Integer selectMaxSeaNumByManual(String taskId, Integer figures);

    /**
     * 查询所有的准考证号-随机
     * 
     * @param taskId
     * @return
     */
    List<String> selectAllSeaNumByRandom(String taskId);

    /**
     * 删除任务下的所有编排数据
     * 
     * @param taskId
     * @return
     */
    Integer deleteArrangeCandidateByTaskId(String taskId);

    /**
     * 查询考生编排数据--分页
     * 
     * @param pageParam
     * @param arrangeCandidateQueryParamVO
     * @return
     */
    Page<TimeRoomCandidateVO> selectTimeRoomCandidatePage(PageParam<TimeRoomCandidateVO> pageParam,
            ArrangeCandidateQueryParamVO arrangeCandidateQueryParamVO);

    /**
     * 查询未编排的考生信息 应该改造成考生id
     * 
     * @param pageParam
     * @param arrangeNoCandidateQueryParamVO
     * @return
     */
    Page<CandidateSubjectNoArrangeVO> selectNoArrangeCandidatePage(PageParam<CandidateSubjectNoArrangeVO> pageParam,
            ArrangeNoCandidateQueryParamVO arrangeNoCandidateQueryParamVO);

    /**
     * 取消编排
     * 
     * @param candidateIds
     * @param taskId
     * @return
     */
    Integer deleteArrangeCandidateByCandidateIds(String candidateIds, String taskId);

    /**
     * 查询批次考场考生信息
     * 
     * @param arrangeCandidateQueryParamVO
     * @param candidateIds
     * @return
     */
    List<TimeRoomCandidateVO> selectTimeRoomCandidateByCandidateIds(
            ArrangeCandidateQueryParamVO arrangeCandidateQueryParamVO, String candidateIds);

    /**
     * 查询准考证信息
     * 
     * @param pageParam
     * @param taskId
     * @param searchText
     * @return
     */
    Page<AdmissionTicketPageVO> selectAdmissionTicketPage(PageParam<AdmissionTicketPageVO> pageParam, String taskId,
            String searchText);

    /**
     * 一键生成准考证
     * 
     * @param taskId
     * @return
     */
    List<AdmissionTicketBean> createAdmissionTicket(String taskId);

    /**
     * 待编排考生数统计
     * 
     * @param taskId 考试任务id
     * @return 待编排考生数
     */
    Integer arrangeCandidateStatistics(String taskId);

    /**
     * 已编排考生数统计
     * 
     * @param taskId 考试任务id
     * @return 已编排考生数
     */
    Integer arrangedCandidateStatistics(String taskId);

    /**
     * 获取已编排的考场id
     * 
     * @param taskId 考试任务id
     * @return 已编排的考场id
     */
    List<String> arrangedRoomIdsStatistics(String taskId);

    /**
     * 编排统计
     * 
     * @param taskId 考试任务id
     * @return 编排统计结果
     */
    ArrangeStatisticsVO arrangeStatistics(String taskId);

    /**
     * 获取未编排的考生数
     * 
     * @param taskId 考试任务id
     * @return 未编排的考生数
     */
    Integer countUnArranged(String taskId);

    /**
     * 考务包座位信息
     * 
     * @param taskId
     * @param timeRoomId
     * @return
     */
    List<Seat> getSeatList(String taskId, String timeRoomId);

    /**
     * 获取GCE考务包座位信息
     * 
     * @param taskId     考试任务id
     * @param timeRoomId 场次id
     * @return GCE考务包座位信息
     */
    List<GceSeat> getGceSeatList(String taskId, String timeRoomId);

    /**
     * 考务包考生信息
     * 
     * @param taskId
     * @param timeRoomId
     * @return
     */
    List<ObtCandidate> getCandidateList(String taskId, String timeRoomId);

    /**
     * 获取GCE考务包考生信息
     * 
     * @param taskId     考试任务id
     * @param timeRoomId 场次id
     * @return GCE考务包考生信息
     */
    List<GceCandidate> getGceCandidateList(String taskId, String timeRoomId);

    /**
     * 获取考生编排数据
     * 
     * @param taskId
     * @param candidateId
     * @return
     */
    List<TimeRoomCandidateVO> selectCandidateInfo(String taskId, String candidateId);

    List<Map<String, Object>> getCandidateDbf(String taskId);

    /**
     * a
     * 
     * @param taskId
     * @return
     */
    List<Map<String, Object>> getKdDbf(String taskId);

    /**
     * a
     * 
     * @param taskId
     * @return
     */
    List<Map<String, Object>> getKqDbf(String taskId);

    /**
     * a
     * 
     * @param taskId
     * @return
     */
    List<Map<String, Object>> getKpDbf(String taskId);

    /**
     * 查询编排的考生数据
     * 
     * @return
     */
    List<PushTimeRoomCandidateVO> selectPushTimeRoomCandidate(String taskId, Integer dataIndex, Integer maxSize);

    /**
     * 查询编排的考生数据总数
     * 
     * @param taskId
     * @return
     */
    int countPushTimeRoomCandidate(String taskId);

    /**
     * 获取已编排的场次数据
     * 
     * @param taskId 考试任务id
     * @return 已编排的场次数据
     */
    List<TimeRoomCandidateDTO> getTimeRoomDTO(String taskId);

    int countAdminssionCandidate(String taskId);

    /**
     * 查询编排的考生数据
     * 
     * @param taskId
     * @param candidateId
     * @return
     */
    List<PushTimeRoomCandidateVO> selectPushTimeRoomCandidateForSimple(String taskId, String candidateId);

    /**
     * 查询场次id为空的考场id和批次id
     * 
     * @param taskId
     * @return
     */
    List<TimeRoomCandidate> selectTimeRoomByTimeRoomIdNull(String taskId);

    /**
     * 更新场次id
     * 
     * @param taskId
     * @return
     */
    void updateTimeRoomByTimeRoomIdNull(String taskId, String timeRoomId, String timeId, String roomId);

    /**
     * 获取已编排考生微信通知VO
     * 
     * @param taskId 考试任务id
     * @return 已编排考生微信通知VO
     */
    Cursor<PushExamNotifyDTO> getArrangedWeChatNotificationVO(String taskId);

    /**
     * 获取微信考生考试安排VO
     * 
     * @param taskId            考试任务id
     * @param candidateSignUpId 考生报名id
     * @return 微信考生考试安排VO
     */
    List<WeChatCandidateArrangeVO> getWeChatCandidateArrangeVO(String taskId, String candidateSignUpId);

    /**
     * 根据多个报名考生id获取微信考生考试安排（针对多个报名任务）
     * 
     * @param candidateSignUpIds 报名考生id（多个用英文逗号分隔）
     * @return 微信考生考试安排
     */
    @Deprecated
    List<WeChatCandidateArrangeVO> getWeChatCandidateArrangeVOByCandidateSignUpIds(String candidateSignUpIds);

    /**
     * 根据多个报名考生id获取微信考生考试安排
     * 
     * @param candidateId
     * @return
     */
    List<WeChatCandidateArrangeVO> getWeChatCandidateArrangeVOByCandidateId(String candidateId);

    /**
     * 获取微信考生考试安排详情VO
     * 
     * @param taskId            考试任务id
     * @param timeId            批次id
     * @param candidateSignUpId 考生报名id
     * @return 微信考生考试安排详情VO
     */
    @Deprecated
    WeChatCandidateArrangeDetailVO getWeChatCandidateArrangeDetailVO(String taskId, String timeId,
            String candidateSignUpId);

    WeChatCandidateArrangeDetailVO getWeChatCandidateArrangeDetailVOByTaskBmTimeCandidate(String taskBmId,
            String timeId, String candidateId);

    /**
     * 获取所有需要修改的编排数据
     * 
     * @param arrangedEditParam 修改编排结果参数
     * @return 所有需要修改的编排数据
     */
    List<TimeRoomCandidate> getBeingEdit(@Param("arrangedEditParam") ArrangedEditParam arrangedEditParam);

    /**
     * 获取准考证号和身份证号的对应关系
     * 
     * @param taskId
     * @return
     */
    List<IdCardAdmissionNumberDTO> getIdCardAdmissionNumber(String taskId);

    /**
     * 获取批次下绑定的考场信息
     * 
     * @param taskId 考试任务id
     * @param timeId 批次id
     * @return 批次下绑定的考场信息
     */
    List<TaskRoom> getRoomByTime(String taskId, String timeId, String deptId, String areaId, String searchText);

    /**
     * 获取科目下绑定的批次信息
     * 
     * @param taskId    考试任务id
     * @param subjectId 科目id
     * @return 科目下绑定的批次信息
     */
    List<Time> getTimeBySubject(String taskId, String subjectId);

    Integer deleteCandidateAllInfo(String taskId, String candidateId);

    /**
     * 根据考试任务id获取所有准考证号
     * 
     * @param taskId 考试任务id
     * @return 所有准考证号
     */
    List<String> listAdmissionNumberByTaskId(String taskId);

    /**
     * 获取考生区域数据
     * 
     * @param taskId
     * @param timeId
     * @param admissionNum
     * @return
     */
    CandidateAreaVO getCandidateArea(String taskId, String timeId, String admissionNum);

    /***
     * 
     * @param taskId
     * @param examId
     * @param admissionNum
     * @return
     */
    TimeRoomCandidate geTimeRoomCandidateByTaskidAndAdnumber(String taskId, String examId, String admissionNum);

    List<Map<String, Integer>> countTime(String taskId);

    List<Map<String, Integer>> countRoom(String taskId, String timeId);

    List<Room> getProctorArrangeRoomList(String taskId);

    Integer getMaxSeatNum(String taskId, String timeId, String roomId);

    List<ArrangeCountVo> countCandidateByTime(String taskId);
}
